package com.atguigu.bigdata.scala.chapter07

object Scala10_Collection_Method_10 {

    def main(args: Array[String]): Unit = {

        // TODO 集合 - 功能方法
        // 计算功能
        // sum. product
        val list = List(1,2,3,4,5)
        //println(list.sum) // 求和 = 10
        // 求差 = 1 - 2 - 3 - 4 = -8
        // 聚合：N => 1
        // 扁平化： 1 => N
        // MapReduce = Map(打散) + Reduce(聚合)
        // 聚合的基本操作：两两计算
        // reduce方法用于聚合数据，基本原理就是集合中的数据两两计算
        // reduce方法需要传递参数，参数的类型为函数类型: (A1, A1)=>A1
        // (Int, Int)=>Int
        def reduceFunction( x : Int, y: Int ): Int = {
            x + y
        }
        def reduceFunction1( x : Int, y: Int ): Int = {
            x - y
        }


//        println(list.reduce(reduceFunction))
//        println(list.reduce(reduceFunction1))
//        println(list.reduce( (x:Int, y:Int) => { x + y } ))
//        println(list.reduce( (x:Int, y:Int) => x + y ))
//        println(list.reduce( (x, y) => x + y ))
        println(list.reduce( _ - _ )) // -13

        // reduceLeft表示数据集合从左边两两计算

        // ((((1-2)-3)-4)-5)
        println(list.reduceLeft(_ - _)) // -13
        // reduceRight表示数据集合从右边两两计算

        // reversed.reduceLeft[B]((x, y) => op(y, x))
        // 【1，2，3，4，5】
        // 【5，4，3，2，1】
        // 4 - 5 = -1
        // 3 - (-1) = 4
        // 2 - 4 = -2
        // 1 - (-2) = 3
        // (1-(2-(3-(4-5))))
        println(list.reduceRight(_ - _)) // 3



    }
}
